# -*- codeing = utf-8 -*-
# @Time : 2021/3/4 13:47
# @Atuthor: 朱朱
# @File: 169正则标点符号的特殊含义.py
# @Software: PyCharm
import re

# \s    表示任意的空白字符
print(re.search(r'\s', 'hello world'))      # ' '
# \n    表示换行
print(re.search(r'\n', 'hello\nworld'))     # '\n'
# \t    表示制表符
print(re.search(r'\t', 'hello\tworld'))     # '\t'

# \S    表示非空白字符和非转换字符
print(re.search(r'\S', '\t\n   x'))         # 'x'

# ()    表示一个正则分组,如果需要表示括号,需要使用\(\)
m = re.search(r'h(\d+)x', 'sh829xkflsa')    # 'h829x'
print(m)
print(m.group(1))   # 829 分组内的内容
# .*  表示任意字符
m1 = re.search(r'\(.*\)','(1+1)*3+5')       # '(1+1)'
print(m1)
print(m1.group())

# .     表示匹配除了换行以外的任意字符.如果想要匹配. 需要使用 \.
# []    表示可选项范围 [x-y],从x到y区间,包含x和y
m2 = re.search(r'f[a-d]m', 'pdsfcm')
print(m2)   # 'fcm'
m3 = re.search(r'f[0-5]m', 'pdsf4m')
print(m3)   # 'fcm'
# m4 = re.search(r'f[0-5]m', 'pdsf40m') # None
# +     表示前面的元素至少出现一次
m4 = re.search(r'f[0-5]+m', 'pdsf40m') # 'f40m'
print(m4)
m5 = re.search(r'f[0-5a-dx]m', 'pdsfxm')  # 'fxm'
print(m5)

# |     用来表示或者  和  [] 有一定的相似，但是有区别
# []    里的值表示的是区间，而且是单个字符
# |     就是可选值，可以出现多个值
m6 = re.search(r'f(x|prz|t)m', 'pdsfprzm')  # 'fprzm'
print(m6)

# {}    表示前面元素出现的次数
# {2}   表示前面元素出现2次
print(re.search(r'go{2}d', 'good'))         # 'good' 表示o,可以出现2次
# {n,}  表示前面的元素可以出n次以上...
print(re.search(r'go{2,}d', 'goooood'))     # 'goooood'
# {,n}  表示前面的元素出现 n 次以下
print(re.search(r'go{,2}d', 'gd'))
# {m,n} 表示前面的元素出现m到n次
print(re.search(r'go{3,5}d', 'gooood'))

# *     表示前面的元素出现任意次数(0次及以上) 等价于  {0,}
x = re.search(r'go*d', 'goooooooooooood')
print(x.group())        # 'goooooooooooood'

# +     表示前面的元素至少出现一次，等价于 {1,}
print(re.search(r'go+d', 'goood'))

# ?     两种用法:
# 1.    规定前面的元素最多只能出现一次，等价于 {,1}
# 2.    将贪婪模式转换成为非贪婪模式
print(re.search(r'go?d', 'god'))

# ^:以指定的内容开头  在 [ ]里还可以表示取反  $:指定内容结尾
print(re.search(r'^a.*i$', 'aofi'))